package cdu.sl.controller;


import cdu.sl.common.domain.Result;
import cdu.sl.domain.dto.LoginByVerCodeFormDTO;
import cdu.sl.domain.dto.LoginFormDTO;
import cdu.sl.domain.dto.RegisterFormDTO;
import cdu.sl.domain.dto.UserUpdateDTO;
import cdu.sl.domain.vo.LoginVO;
import cdu.sl.domain.vo.UserInfoVO;
import cdu.sl.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotNull;

@Api(tags = "用户相关接口")
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
@Slf4j
public class UserController {

    private final UserService userService;

    /**
     * 用户注册
     *
     * @param registerFormDTO 注册表单实体
     * @return 统一返回结果Result
     */
    @PostMapping("/register")
    @ApiOperation("用户注册接口")
    public Result<Void> register(@RequestBody @Validated RegisterFormDTO registerFormDTO) {
        log.info("收到用户注册请求：{}", registerFormDTO);
        userService.register(registerFormDTO);
        return Result.success();
    }


    /**
     * 用户登录
     *
     * @param loginFormDTO 登录表单实体
     * @return 统一返回结果Result
     */
    @PostMapping("/login")
    @ApiOperation("用户登录接口")
    public Result<LoginVO> login(@RequestBody @Validated LoginFormDTO loginFormDTO) {
        log.info("收到用户登录请求：{}", loginFormDTO);
        LoginVO loginVO = userService.login(loginFormDTO);
        return Result.success(loginVO);
    }


    /**
     * 用户通过邮箱地址获取验证码
     * @param email 邮箱地址
     * @return 无
     */
    @ApiOperation("用户获取验证码")
    @GetMapping("/verCode")
    public Result<Void> code(String email) {
        log.info("用户通过邮箱获取验证码 :{}", email);
        userService.sendVerificationCode(email);
        return Result.success();
    }


    /**
     * 用户通过验证码登录
     * @param loginByVerCodeFormDTO 验证码登录表单实体
     * @return 用户登录信息VO
     */
    @ApiOperation("用户通过验证码登录")
    @PostMapping("/loginByVerCode")
    public Result<LoginVO> loginByVerCode(@RequestBody LoginByVerCodeFormDTO loginByVerCodeFormDTO){
        log.info("用户使用验证码登录：{}",loginByVerCodeFormDTO);
        LoginVO loginVO=userService.loginByVerCode(loginByVerCodeFormDTO);
        return Result.success(loginVO);
    }


    /**
     * 获取当前用户信息（从token解析）
     * @return 当前用户信息
     */
    @GetMapping("/info")
    @ApiOperation("获取当前用户信息接口")
    public Result<UserInfoVO> getCurrentUser() {
        log.info("收到获取当前用户信息请求");
        UserInfoVO userInfoVO = userService.getCurrentUserInfo();
        return Result.success(userInfoVO);
    }

    /**
     * 修改用户信息
     * @param userUpdateDTO 用户更新信息
     * @return 更新后的用户信息
     */
    @PutMapping()
    @ApiOperation("修改用户信息接口")
    public Result<UserInfoVO> updateUser(@RequestBody @Validated UserUpdateDTO userUpdateDTO) {
        log.info("收到修改用户信息请求：{}", userUpdateDTO);
        UserInfoVO userInfoVO = userService.updateUser(userUpdateDTO);
        return Result.success("修改成功", userInfoVO);
    }



}
